package indi.flynn.zhouyi.log.annotations;

import indi.flynn.zhouyi.log.enums.BizFlowEnum;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 业务流程日志注解
 * 用于标记需要自动处理业务流程日志的方法
 * 被标记的方法会在执行前调用BizFlowLogger.initContext，执行后调用BizFlowLogger.clearContext
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BizFlowLog {

    /**
     * 业务流程
     * @return 业务流程枚举
     */
    BizFlowEnum value();

    /**
     * 业务流程ID参数列表
     * 用于指定如何从方法参数中构建BizFlowId
     * 使用SpEL表达式从方法参数中提取值
     * 格式为：{"参数名1=表达式1", "参数名2=表达式2"}
     *
     * 可以直接使用参数名引用方法参数：
     * 例如：{"orderId=#orderId", "userId=#userId", "amount=#request.amount"}
     *
     * 也可以使用索引访问参数：
     * 例如：{"orderId=#args[0]", "userId=#args[1].id"}
     *
     * @return 业务流程ID参数列表
     */
    String[] bizIdParams() default {};
}
